iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
自我挑戰組

gRPC通訊框架認識與實作系列 第 13

gRPC通訊框架認識與實作【Day 13】

  • 分享至 

  • xImage
  •  

今天要實作傳遞不同種類的物件,首先我們先設計好server,先在.proto檔裡面新增好一個新的request跟response,以及新的接收函式IronMan02,對應接收不同結構的資料

message IronManRequest02{
  repeated string name = 1; //getNameKist()
}

message IronManResponse02{
  string result = 1;
}

我們在.proto檔中設定新的request跟response,我們這次新定義的name是一個List的資料

service IronManService{
  rpc IronMan01(IronManRequest01) returns (IronManResponse01) {}
  rpc IronMan02(IronManRequest02) returns (IronManResponse02) {}
}

完成後重新讓protobuf生成新的method。
一樣在IronManServiceImpl裡面實作我們的method,因為我們這次要接收的是一組list,所以我們的method可以這樣寫:

@Override
public void ironMan02(IronManProto.IronManRequest02 request, StreamObserver<IronManProto.IronManResponse02> responseObserver) {
    //定義接收一組list的訊息
    ProtocolStringList nameList = request.getNameList();
    for(String string : nameList){
        System.out.println("List內容是: " + string);
    }

    System.out.println("我是server端, 我收到一組List");

    //封裝server的回應
    IronManProto.IronManResponse02.Builder builder = IronManProto.IronManResponse02.newBuilder();
    builder.setResult("server回傳,表示回應");
    IronManProto.IronManResponse02 ironManResponse02 = builder.build();

    responseObserver.onNext(ironManResponse02);
    responseObserver.onCompleted();
}

用迴圈將收到的資料印出,然後封裝好要response的訊息,準備回傳給client端,這樣我們的server端就作好了。

接下來實作Client端,在gRPCClient新增一個client02,然後寫上

public static void main(String[] args) {
    //設計好連線資訊
    String host = "localhost";
    int port = 5000;
    //通訊管道建立
    ManagedChannel managedChannel = ManagedChannelBuilder.forAddress(host,port).usePlaintext().build();

    //判斷是否有連線成功
    if (managedChannel != null && !managedChannel.isShutdown())
        System.out.println(" channel build success !! " + host + ":" + port);

        //調用連線函式
        IronManServiceGrpc.IronManServiceBlockingStub ironManServiceBlockingStub = IronManServiceGrpc.newBlockingStub(managedChannel);
        IronManProto.IronManRequest02.Builder builder = IronManProto.IronManRequest02.newBuilder();
        //設定List的資料
        builder.addName("Allen");
        builder.addName("Bob");
        builder.addName("Cindy");
        System.out.println("client端送一個List出去");
        //包裹List
        IronManProto.IronManRequest02 ironManRequest02 = builder.build();

        //傳送給server並準備接收回應
        IronManProto.IronManResponse02 ironManResponse02 = ironManServiceBlockingStub.ironMan02(ironManRequest02);
        String result = ironManResponse02.getResult();
        System.out.println(result);
        managedChannel.shutdown();
}

一樣調用newBlockingStub這個函式,並建立連線。調用IronManRequest02建立新的傳輸內容,並設定list內的資料,最後包裹好資料。接著就呼叫server的ironMan02()並將資料傳遞過去,最後我們來看看結果。
Client端這邊顯示送出一組List出去:
https://ithelp.ithome.com.tw/upload/images/20230918/20147417WTBJIKSo9Z.jpg

而Server端這邊也順利接收到資料了
https://ithelp.ithome.com.tw/upload/images/20230918/20147417UhdIpQmvuh.jpg
我們順利將資料傳遞過去,其實跟第一次實作的內容差不多,差別只在於我們傳遞的資料型態不同,而資料型態需要在.proto先行設定。

這樣就完成我們第二個client的實作了


上一篇
gRPC通訊框架認識與實作【Day 12】
下一篇
gRPC通訊框架認識與實作【Day 14】
系列文
gRPC通訊框架認識與實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言